package bean;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorType;
import javax.persistence.Entity;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import bean.vo.ItemRemitoVO;
import bean.vo.RemitoVO;

@Entity 
@Table( name = "remitos" )
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="tipo",discriminatorType=DiscriminatorType.STRING)
@SuppressWarnings({"unchecked"})
public class Remito extends EntidadPersistente{
	protected Integer numeroRemito;
	protected Date fechaEmision;
	protected Date fechaEntrega;
	protected boolean recibioConforme;
	@OneToMany( cascade = CascadeType.ALL, mappedBy = "remito" )
	protected List<ItemRemito> itemsRemito;
	protected boolean procesado;
	
	public Remito () {
		this.itemsRemito = new ArrayList<ItemRemito>();
	}

	public Remito (Integer numeroRemito, Date fechaEmision, Date fechaEntrega) {
		this.numeroRemito = numeroRemito;
		this.fechaEmision = fechaEmision;
		this.fechaEntrega = fechaEntrega;
		this.itemsRemito = new ArrayList<ItemRemito>();
		
		this.procesado = false;
	}
	
	public RemitoVO getVO() {
		RemitoVO vo = new RemitoVO();
		vo.setFechaEmision(fechaEmision);
		vo.setFechaEntrega(fechaEntrega);
		vo.setItemsRemito(new VOList<ItemRemitoVO>().getVoList(itemsRemito));
		vo.setNumeroRemito(numeroRemito);
		vo.setProcesado(procesado);
		vo.setRecibioConforme(recibioConforme);
		
		return null;
	}
	
	public Integer getNumeroRemito() {
		return numeroRemito;
	}
	
	public void setNumeroRemito(Integer numeroRemito) {
		this.numeroRemito = numeroRemito;
	}
	
	public Date getFechaEmision() {
		return fechaEmision;
	}
	
	public void setFechaEmision(Date fechaEmision) {
		this.fechaEmision = fechaEmision;
	}
	
	public Date getFechaEntrega() {
		return fechaEntrega;
	}
	
	public void setFechaEntrega(Date fechaEntrega) {
		this.fechaEntrega = fechaEntrega;
	}
	
	public boolean isRecibioConforme() {
		return recibioConforme;
	}
	
	public void setRecibioConforme(boolean recibioConforme) {
		this.recibioConforme = recibioConforme;
	}
	
	public List<ItemRemito> getItemsRemito() {
		return itemsRemito;
	}
	
	public void setItemsRemito(List<ItemRemito> itemsRemito) {
		this.itemsRemito = itemsRemito;
	}
	
	public void agregarItem(Producto producto, Integer cantidad, OrdenPedido ordenReferencia)
	{
		ItemRemito newItem = new ItemRemito(this, producto, cantidad);
		newItem.setOrdenReferencia(ordenReferencia);
		
		for (ItemRemito item : itemsRemito) {
			if (item.equals(newItem)) {
				item.setCantidad(item.getCantidad() + cantidad);
				return;
			}
		}
	
		itemsRemito.add(newItem);
	}
	
	public void eliminarItem(Producto producto)
	{
		ItemRemito item = new ItemRemito(this, producto, null);
		
		if (itemsRemito.contains(item))
		{
			itemsRemito.remove(item);
		}
	}
	
	public boolean isProcesado() {
		return procesado;
	}

	public void setProcesado(boolean procesado) {
		this.procesado = procesado;
	}
}
